package estore.service;

import estore.model.Product3;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 商品服务类，负责商品相关的业务逻辑
 * 目前使用内存Map模拟数据库
 */
public class ProductService3 {

    // 使用Map存储商品数据，key是商品ID，value是商品对象
    // 优点：通过ID查找商品时，时间复杂度是O(1)，非常高效
    private final Map<String, Product3> productData = new HashMap<>();

    /**
     * 构造函数，初始化一些商品数据
     */
    public ProductService3() {
        initializeSampleData();
    }

    /**
     * 初始化示例数据
     */
    private void initializeSampleData() {
        // 为Java书籍创建标签
        Set<String> javaTags = new HashSet<>();
        javaTags.add("编程");
        javaTags.add("畅销");
        javaTags.add("热门");
        javaTags.add("热门"); // 故意添加重复标签，验证Set的唯一性
        javaTags.add("技术");

        // 为MySQL书籍创建标签
        Set<String> mysqlTags = new HashSet<>();
        mysqlTags.add("数据库");
        mysqlTags.add("技术");
        mysqlTags.add("进阶");

        // 为颈椎康复指南创建标签
        Set<String> healthTags = new HashSet<>();
        healthTags.add("健康");
        healthTags.add("生活");
        healthTags.add("畅销");

        // 为生发秘籍创建标签（无标签）

        productData.put("p001", new Product3("p001", "Java从入门到精通", 99.0, 100, javaTags));
        productData.put("p002", new Product3("p002", "高性能MySQL", 128.5, 50, mysqlTags));
        productData.put("p003", new Product3("p003", "颈椎康复指南", 45.0, 200, healthTags));
        productData.put("p004", new Product3("p004", "生发秘籍", 88.0, 0)); // 库存为0的商品，无标签

        // 验证Set的唯一性
        System.out.println("Java书籍标签数量（验证唯一性）: " + javaTags.size());
        System.out.println("Java书籍标签内容: " + javaTags);
    }

    /**
     * 获取所有商品列表
     * @return 商品列表
     */
    public List<Product3> getAllProducts() {
        // 从Map的值集合创建一个新的ArrayList并返回
        return new ArrayList<>(productData.values());
    }

    /**
     * 根据ID查找商品
     * @param id 商品ID
     * @return 找到的商品对象，如果不存在则返回null
     */
    public Product3 findProductById(String id) {
        return productData.get(id);
    }

    /**
     * 根据标签搜索商品
     * @param tag 要搜索的标签
     * @return 包含该标签的商品列表
     */
    public List<Product3> findProductsByTag(String tag) {
        List<Product3> result = new ArrayList<>();
        for (Product3 product : productData.values()) {
            if (product.hasTag(tag)) {
                result.add(product);
            }
        }
        return result;
    }

    /**
     * 获取所有商品的标签（去重）
     * @return 所有不重复的标签集合
     */
    public Set<String> getAllTags() {
        Set<String> allTags = new HashSet<>();
        for (Product3 product : productData.values()) {
            allTags.addAll(product.getTags());
        }
        return allTags;
    }

    /**
     * 为商品添加标签
     * @param productId 商品ID
     * @param tag 要添加的标签
     * @return 是否添加成功
     */
    public boolean addTagToProduct(String productId, String tag) {
        Product3 product = productData.get(productId);
        if (product != null) {
            return product.addTag(tag);
        }
        return false;
    }

    /**
     * 从商品移除标签
     * @param productId 商品ID
     * @param tag 要移除的标签
     * @return 是否移除成功
     */
    public boolean removeTagFromProduct(String productId, String tag) {
        Product3 product = productData.get(productId);
        if (product != null) {
            return product.removeTag(tag);
        }
        return false;
    }
}